Statistik och dataanalys I, 15 hp

Datorlaboration 3

Authors

Matias Quiroz

Mona Sfaxi

Publicerad

September 13, 2023

Warning

Den här labben förutsätter att följande paket finns installerade:

  • openxlsx

  • mosaic

  • vcd

  • dplyr

Paket kan installeras via kommandot install.packages('packagename'), där 'packagename' är namnet på paketet, t.ex 'mosaic'.

Introduktion

I den här datorlabben kommer vi att beskriva samband mellan två kategoriska variabler, samt samband mellan en numerisk och kategorisk variabel. Ni kommer också lära er om betingade fördelningar i R och hur man jämför fördelningar grafiskt. Vi kommer också att arbeta med tidsserier.

💪 Uppgift 0.1

Se till att paketen ovan är installerade innan du fortsätter med resten.

💪 Uppgift 0.2

Skapa en mapp Lab3 i din kursmapp SDA1 (såsom ni gjorde i Lab 1). Ladda ner Quarto-filen för denna lab genom att högerklicka här och välj ‘Spara länk’ eller något likande från menyn som dyker upp. Spara filen i din nya Lab3 mapp. Öppna Quarto-filen i RStudio. Du kan nu fortsätta med denna laboration direkt i Quarto-dokumentet, där du också fyller i svaren på dina laborationsövningar. Du kan alltså lämna den här webbsidan nu och fortsätta arbetet i RStudio.

Väl inne i RStudio med öppnat Quarto-dokument i ‘Editor’ kan ni gå över till ‘Source mode’ genom att klicka på ‘Source’ i det vänstra hörnet av din ‘Editor’. Source mode är detaljerat och bra att skriva kod i eftersom man har full kontroll på dokumentet, men det är svårt att få en översikt av dokumentet. Prova nu att gå över till ‘Visual mode’ genom att klicka på ‘Visual’ i det vänstra hörnet av din ‘Editor’. Vi rekommenderar att ni mestadels arbetar i Visual mode, men att gå över till Source mode när man verkligen vill få till någon detalj som är svår att ändra i Visual mode. ´

💪 Uppgift 0.3

Klicka på knappen Render i Editor-fönstret för att kompilera filen till en webbsida (html). Webbsidan kommer antingen att visas i Viewer-fönstret i RStudio eller i webbläsaren på din dator. Om din webbsida visas i webbläsaren rekommenderar vi att du ändrar inställningarna i RStudio så webbsidan visas i Viewer-fönstret. Du ställer in detta på menyn Tools/Global Options… och sen väljer du Viewer Pane vid Show output preview in:

💪 Uppgift 0.4

Quarto säkerställer att man befinner sig i korrekt arbetsmapp när koden i dokumentet exekveras. Med korrekt arbetsmapp menas den mappen ni sparade .qmd filen i. Vill du komma åt dataseten via load() kommandot måste dataseten vara sparade i samma mapp.

Ett vanligt arbetssätt är att man jobbar i RStudio i en separat .R fil, där man kan testa att köra kod innan den kopieras över till Quarto dokumentet. Den .R filen kommer inte att ha samma ‘working directory’ som Quarto filen. Du måste då använda setwd() funktionen i .R filen för att ställa in ‘working directory’. Notera att man också välja att skriva kod i Console som finns längst ner i RStudio. Där måste du också ställa in rätt ‘working directory’. Det är inte rekommenderat att använda Console eftersom koden inte sparas där. Du kanske kommer på något jättesmart som du glömmer att kopiera över till Quarto dokumentet och kan senare inte hitta det du skrev.

RStudios Editor ändras beroende på vilken sorts fil du har öppen

Notera att ikonerna i Editor är annorlunda när du har ett Quarto-dokument öppet jämfört med tidigare när vi hade en fil med ren R-kod (dvs en .R fil) öppen.

Skapa en ny .R som du döper till Lab3_test_code.R och ställ in ‘working directory’ till den nya mappen genom att följa anvisningarna från Lab 1.

💪 Uppgift 0.5

Ladda ner SmartPhones.RData (här), FevChildren.RData (här) och CAPM_data.RData (här). Filerna kommer automatiskt att sparas ner, oftast i download mappen på datorn ni sitter vid. Kopiera över filerna till Lab3 mappen ni skapade ovan.

Det finns olika sätt att läsa in .RData filer genom load() funktionen. Ett sätt är att skriva t.ex load("SmartPhones.RData"). Notera att om du gör detta i Lab3_test_code.R förutsätter det att SmartPhones.RData ligger i den arbetsmappen man angivit genom setwd() funktionen. Ett annat sätt att ladda in en .RData fil är att läsa in den direkt från webben med en kombination av load() funktionen och url() funktionen.

load(file = url("https://github.com/StatisticsSU/SDA1/blob/main/datorlab/lab3/SmartPhones.RData?raw=true"))
Smartphones_from_URL <- SmartPhones

Argumentet till url() funktionen är en sträng som innehåller länken till kurshemsidans git repository där SmartPhones.RData finns lagrad. I raden efter har vi sparat dataframen i en variabel som heter SmartPhones_from_URL så att du i nästa uppgift kan jämföra mot den du läser in från din lokala fil som du sparade ovan i i Lab3 mappen.

💪 Uppgift 0.6

Använd load() funktionen (utan url() funktionen) för att läsa in SmartPhones.RData lokalt från din dator i Quarto dokumentet. Jämför den lokalt inlästa filen med den du läste in från webben (finns sparad i SmartPhones_from_URL).

load("SmartPhones.RData")
str(SmartPhones)
'data.frame':   2498 obs. of  2 variables:
 $ age.group: chr  "50+" "50+" "50+" "35-49" ...
 $ brand    : chr  "Samsung" "Samsung" "Others" "Samsung" ...
head(SmartPhones)
  age.group    brand
1       50+  Samsung
2       50+  Samsung
3       50+   Others
4     35-49  Samsung
5       50+ Motorola
6     35-49   iPhone
Tip

För att jämföra dataseten här räcker det att använda str() och head().

Det är viktigt att ni vet hur man läser in .RData filer lokalt. Det kan vara så att github är tillfälligt nere, eller att ni temporärt jobbar utan tillgång till internet. I resten av labben så läses filerna in från webben, men nu vet ni hur ni kan göra om webben av någon anledning skulle vara nere.

1. Simultan och marginella fördelningar utifrån en korstabell

Kategoriska variabler är variabler vars utfall är kategorier. I Lab 1 lärde vi oss att uttrycka fördelningen för en kategorisk variabel via en frekvenstabell uttryckt i andelar. En fördelning av en endaste variabel, till exempel \(y\), kallas för marginalfördelningen för \(y\). När vi betraktar två kategoriska variabler, till exempel \(x\) och \(y\) , så finns det olika fördelningar vi kan tänka oss:

  • Marginella fördelningar, en fördelning för vardera variabel \(x\) och \(y\).
  • Simultan fördelning för variablerna \(x\) och \(y\) (endast en fördelning).
  • Betingade fördelningar, en fördelning för vardera variabel \(x\) och \(y\), betingat på den andra.

Notera att dessa tre typer av fördelningar finns oavsett om variablerna är numeriska eller kategoriska. När bägge variablerna är kategoriska räknas dessa fördelningar utifrån en så kallad korstabell (se nedan). Att känna till de olika fördelningstyperna är mycket viktigt och den kunskapen tillämpas på alla statistikkurser framöver. Att förstå dessa, samt kunna urskilja dom från varandra, kommer att underlätta förståelsen av statistik såväl som sannolikhetsteori som ni kommer stöta på under Del 2 av kursen.

För att illustrera dessa koncept i ett praktiskt problem ska vi undersöka om det föreligger ett samband mellan vilken smartphone man föredrar och vilken ålderskategori man tillhör. Data finns i SmartPhones.RData.

load(file = url("https://github.com/StatisticsSU/SDA1/blob/main/datorlab/lab3/SmartPhones.RData?raw=true")) 
str(SmartPhones)
'data.frame':   2498 obs. of  2 variables:
 $ age.group: chr  "50+" "50+" "50+" "35-49" ...
 $ brand    : chr  "Samsung" "Samsung" "Others" "Samsung" ...
head(SmartPhones) # Prints first few observations
  age.group    brand
1       50+  Samsung
2       50+  Samsung
3       50+   Others
4     35-49  Samsung
5       50+ Motorola
6     35-49   iPhone

Låt oss börja med att skapa en korstabell. En korstabell är en tabell som innehåller frekvensen för varje utfall av variablerna. Notera att om vi har två kategoriska variabler, säg \(x\) och \(y\), så är utfallen alla parvisa kombinationer av utfallen av de respektive variablerna.

suppressMessages(library(mosaic))
tally(~ brand + age.group, data = SmartPhones)
          age.group
brand      18-34 35-49 50+
  Asus        25    17   8
  Casio       25    11   6
  HTC         26    11  10
  iPhone     354   219 284
  LG          87    83 166
  Motorola    33    30  71
  Others       6     6  44
  Samsung    264   252 351
  Sony        48    33  28

Eftersom age.group har 3 utfall och brand har 9 utfall, finns det totalt \(3\cdot9=27\) olika utfall i korstabellen.

Formula-syntaxen (nämndes i Lab 1) ~ brand + age.group talar om att vi vill göra en frekvenstabell av brand och age.group. Vi kan också använda tecknet & istället för +.

💪 Uppgift 1.1

Gör en korstabell genom att använda & istället för +. Släng även om ordningen på variablerna, dvs age.group före brand. Förändras frekvensantalen?

tally(~ age.group & brand, data = SmartPhones)
         brand
age.group Asus Casio HTC iPhone  LG Motorola Others Samsung Sony
    18-34   25    25  26    354  87       33      6     264   48
    35-49   17    11  11    219  83       30      6     252   33
    50+      8     6  10    284 166       71     44     351   28

Vi kan lägga till radsummor och kolumnsummor till korstabellen genom argumentet margins = TRUE.

tally(~ brand + age.group, data = SmartPhones, margins = TRUE) # Show row and column totals
          age.group
brand      18-34 35-49  50+ Total
  Asus        25    17    8    50
  Casio       25    11    6    42
  HTC         26    11   10    47
  iPhone     354   219  284   857
  LG          87    83  166   336
  Motorola    33    30   71   134
  Others       6     6   44    56
  Samsung    264   252  351   867
  Sony        48    33   28   109
  Total      868   662  968  2498

💪 Uppgift 1.2

Svara på följande frågor:

  • Hur många deltog i undersökningen?

  • Hur många föredrog en Casio smartphone?

  • Hur många i åldersgruppen 18-34 föredrog en Samsung telefon?

Tabeller är ofta enklare att utläsa när de anges i relativa frekvenser (alternativt i procentform). Detta kan åstadkommas med argumentet format.

tally(~ brand + age.group, data = SmartPhones, margins = TRUE, format = "proportion")
          age.group
brand            18-34       35-49         50+       Total
  Asus     0.010008006 0.006805444 0.003202562 0.020016013
  Casio    0.010008006 0.004403523 0.002401922 0.016813451
  HTC      0.010408327 0.004403523 0.004003203 0.018815052
  iPhone   0.141713371 0.087670136 0.113690953 0.343074460
  LG       0.034827862 0.033226581 0.066453163 0.134507606
  Motorola 0.013210568 0.012009608 0.028422738 0.053642914
  Others   0.002401922 0.002401922 0.017614091 0.022417934
  Samsung  0.105684548 0.100880705 0.140512410 0.347077662
  Sony     0.019215372 0.013210568 0.011208967 0.043634908
  Total    0.347477982 0.265012010 0.387510008 1.000000000
tally(~ brand + age.group, data = SmartPhones, margins = TRUE, format = "percent")
          age.group
brand            18-34       35-49         50+       Total
  Asus       1.0008006   0.6805444   0.3202562   2.0016013
  Casio      1.0008006   0.4403523   0.2401922   1.6813451
  HTC        1.0408327   0.4403523   0.4003203   1.8815052
  iPhone    14.1713371   8.7670136  11.3690953  34.3074460
  LG         3.4827862   3.3226581   6.6453163  13.4507606
  Motorola   1.3210568   1.2009608   2.8422738   5.3642914
  Others     0.2401922   0.2401922   1.7614091   2.2417934
  Samsung   10.5684548  10.0880705  14.0512410  34.7077662
  Sony       1.9215372   1.3210568   1.1208967   4.3634908
  Total     34.7477982  26.5012010  38.7510008 100.0000000
#2498 personer deltog i studien totalt
#42st föredrog en Casio
#264st personer som var i åldersgrupp 18-34 och föredrog Samsung

Fördelningen ovan i de celler som inte inkluderar Total är den simultana fördelningen för variablerna, dvs:

tally(~ brand + age.group, data = SmartPhones, margins = FALSE, format = "proportion")
          age.group
brand            18-34       35-49         50+
  Asus     0.010008006 0.006805444 0.003202562
  Casio    0.010008006 0.004403523 0.002401922
  HTC      0.010408327 0.004403523 0.004003203
  iPhone   0.141713371 0.087670136 0.113690953
  LG       0.034827862 0.033226581 0.066453163
  Motorola 0.013210568 0.012009608 0.028422738
  Others   0.002401922 0.002401922 0.017614091
  Samsung  0.105684548 0.100880705 0.140512410
  Sony     0.019215372 0.013210568 0.011208967

En cell i den simultana fördelningen anger andelen av det totala antalet som hamnar i det utfallet. Exempelvis är \(\approx 0.088\) (\(\approx 8.8\%\) ) av alla 2498 deltagare i åldersgruppen 35-49 och föredrar en iPhone. En fördelning summerar alltid till 1, vilket bekräftades ovan när vi inkluderade Total via margins = TRUE (cellen längst ner till höger).

💪 Uppgift 1.3

Svara på följande frågor:

  • Hur stor andel av alla föredrog en Casio smartphone?

  • En andel på 0.0168/1,68% andel föredrar en Casio smartphone.

  • Hur stor andel av alla tillhörde åldersgruppen 18-34 samt föredrog en Samsung telefon?

  • Det var en andel på 0.1057/10,57% andel av alla åldergruppen 18-34 föredrog en Samsung telefon.

  • Vad är problemet med påståendet “Ca 14% av de tillfrågade i åldersgruppen 18-34 föredrog en iPhone”?

  • Det stämmer inte eftersom vi då måste titta på fördelningen av telefonmärken betingat på åldersgruppen 18-34 för att kunna svara på den frågan. Eller mer specifikt, antal som föredarar iPhone delat på det totala antalet i åldersgruppen 18-34.

💪 Uppgift 1.4

Använd tally() funktionen såsom ni gjorde i Lab 1 för att beräkna marginalfördelningen för vardera variabel. Använd argumentet format = "proportion". Känner ni igen dessa fördelningar från tidigare i labben?

tally(~ age.group, data = SmartPhones, margins = TRUE, format = "proportion") #Marginalfördelningen för åldersgrupper
age.group
   18-34    35-49      50+    Total 
0.347478 0.265012 0.387510 1.000000 
tally(~ brand, data = SmartPhones, margins = TRUE, format = "proportion")
brand
      Asus      Casio        HTC     iPhone         LG   Motorola     Others 
0.02001601 0.01681345 0.01881505 0.34307446 0.13450761 0.05364291 0.02241793 
   Samsung       Sony      Total 
0.34707766 0.04363491 1.00000000 
#Marginalfördelningen för telefonmärken

Marginalfördelningarna kan alltså fås via kolumntotalen och radtotalen i simultanfördelningen via argumentet margins = TRUE.

💪 Uppgift 1.5

Vad summerar varje marginalfördelning till? Du bör kunna svara på den här frågan utan att koda.

Summerar marginalfördelning är 1.

2. Betingade fördelningar utifrån en korstabell

I sista delfrågan på Uppgift 1.3 frågades vad problemet med påståendet “Ca 14% av de tillfrågade i åldersgruppen 18-34 föredrog en iPhone” var. Påståendet hade varit korrekt om formuleringen var “Ca 14% av alla tillfrågade tillhörde åldersgruppen 18-34 och föredrog en iPhone”. För att räkna ut den korrekta andelen i det felaktiga påståendet måste vi enbart betrakta de tillfrågade som tillhör åldersgruppen 18-34, dvs 868 personer (enligt tabellen i Uppgift 1.1). Av dessa föredrog 354 personer iPhone (enligt tabellen i Uppgift 1.1). Den korrekta andelen beräknas således till \(354/868\approx 0.41\), eller ca 41%.

Terminologin är viktig att lära sig. Vi säger att vi har en betingad fördelning för smartphonepreferens betingat på åldersgrupp (i det här fallet åldersgruppen 18-34). Ofta säger vi enbart “fördelning för smartphonepreferens betingat på åldersgrupp (i det här fallet åldersgruppen 18-34)”, och det är underförstått att det är en betingad fördelning. Vi skulle också kunna säga “fördelningen för smartphonepreferens givet åldersgrupp”.

Vi skulle kunna kunna räkna ut den betingade fördelningen för de övriga utfallen för hand, Asus (\(25/868\)), Casio (\(25/868\)), HTC (\(26/868\)), osv. Räkna ut för hand är viktigt på tentan, så se till att ni förstår hur man gör! I praktiken låter vi datorn göra räkningarna åt oss. I R kan vi göra detta genom användning av formula-syntax tecknet |, som betyder betingat på variabeln som följer efter tecknet.

tally(~ brand | age.group, data = SmartPhones, format = "proportion")
          age.group
brand            18-34       35-49         50+
  Asus     0.028801843 0.025679758 0.008264463
  Casio    0.028801843 0.016616314 0.006198347
  HTC      0.029953917 0.016616314 0.010330579
  iPhone   0.407834101 0.330815710 0.293388430
  LG       0.100230415 0.125377644 0.171487603
  Motorola 0.038018433 0.045317221 0.073347107
  Others   0.006912442 0.009063444 0.045454545
  Samsung  0.304147465 0.380664653 0.362603306
  Sony     0.055299539 0.049848943 0.028925620

Ovan ser vi tre olika betingade fördelningar, en för varje åldersgrupp. En betingad fördelning är också en fördelning: En fördelning summerar alltid till 1. Vi kan bekräfta detta för varje åldersgrupp genom att använda margins = TRUE som argument.

tally(~ brand | age.group, data = SmartPhones, format = "proportion", margins = TRUE)
          age.group
brand            18-34       35-49         50+
  Asus     0.028801843 0.025679758 0.008264463
  Casio    0.028801843 0.016616314 0.006198347
  HTC      0.029953917 0.016616314 0.010330579
  iPhone   0.407834101 0.330815710 0.293388430
  LG       0.100230415 0.125377644 0.171487603
  Motorola 0.038018433 0.045317221 0.073347107
  Others   0.006912442 0.009063444 0.045454545
  Samsung  0.304147465 0.380664653 0.362603306
  Sony     0.055299539 0.049848943 0.028925620
  Total    1.000000000 1.000000000 1.000000000

Notera att en Total för radsummorna inte finns i tabellen. Detta beror på att R vet att vi betingar på a~ age.group, och då saknar radsummorna en betydelse och därför skrivs de inte ut.

Ett alternativ sätt att skriva betingningen ~ brand | age.group är brand ~ age.group , utan att använda |-tecknet. R tolkar då variabeln vänster om ~ som variabeln fördelningen ska beräknas för, och variabeln till höger om ~ som variabeln det ska betingas på. Det här alternativa sättet att skriva formula-syntax är det som används i många R funktioner vi kommer att stöta på senare i kursen, till exempel lm() funktionen som används i regression. Även plot() och boxplot() som vi använder senare i den här labben använder den alternativa formula-syntaxen.

💪 Uppgift 2.1

Använd den allternativa formula-syntaxen för att beräkna den betingade fördelningen ovan. Stäm av att resultaten blir desamma.

tally(brand ~ age.group, data = SmartPhones, format = "proportion", margins = TRUE)
          age.group
brand            18-34       35-49         50+
  Asus     0.028801843 0.025679758 0.008264463
  Casio    0.028801843 0.016616314 0.006198347
  HTC      0.029953917 0.016616314 0.010330579
  iPhone   0.407834101 0.330815710 0.293388430
  LG       0.100230415 0.125377644 0.171487603
  Motorola 0.038018433 0.045317221 0.073347107
  Others   0.006912442 0.009063444 0.045454545
  Samsung  0.304147465 0.380664653 0.362603306
  Sony     0.055299539 0.049848943 0.028925620
  Total    1.000000000 1.000000000 1.000000000

💪 Uppgift 2.2

Svara på följande frågor:

  • Vilken är den populäraste smartphonen i åldersgruppen 35-49?

  • Samsung (38%)

  • Hur stor andel av de i åldersgruppen 18-34 föredrar en Sony?

  • 0,055

  • Hur stor andel av de i åldersgruppen 18-34 föredrar en Sony eller en Samsung?

  • 0,304+0,055=0.3594/35.94%

  • Vad är problemet med påståendet “Bland de som föredrar iPhone är det en större andel, ca 40%, som tillhör åldersgruppen 18-34 gentemot ca 29% som tillhör åldersgruppen 50+”?

    Vi bör vända på betingningen i så fall, dvs vi bör då titta på fördelningen av åldersgrupper betingat på att man föredrar en iPhone

💪 Uppgift 2.3

Uttryck de betingade fördelningarna ovan i procentform istället för andelar.

tally(~ brand | age.group, data = SmartPhones, format = "percent", margins = TRUE)
          age.group
brand            18-34       35-49         50+
  Asus       2.8801843   2.5679758   0.8264463
  Casio      2.8801843   1.6616314   0.6198347
  HTC        2.9953917   1.6616314   1.0330579
  iPhone    40.7834101  33.0815710  29.3388430
  LG        10.0230415  12.5377644  17.1487603
  Motorola   3.8018433   4.5317221   7.3347107
  Others     0.6912442   0.9063444   4.5454545
  Samsung   30.4147465  38.0664653  36.2603306
  Sony       5.5299539   4.9848943   2.8925620
  Total    100.0000000 100.0000000 100.0000000
Tip

Kom ihåg att argumentet format bestämmer tabellens format.

I sista delfrågan på Uppgift 2.2 frågades vad problemet med påståendet “Bland de som föredrar iPhone är det en större andel, ca 40%, som tillhör åldersgruppen 18-34 gentemot ca 29% som tillhör åldersgruppen 50+” . Det finns två varningstecken här. Det första är formuleringen “Bland de som föredrar en iPhone…”, vilket betyder att vi bara betraktar de som har en iPhone — dvs vi måste betinga på iPhone! Andra varningstecknet är att vi uttalar oss om andelar för åldersgrupper — den betingade fördelningen vi skapade ovan är andelar över smartphonepreferens, inte över åldersgrupper! De andelar vi har angett i påståendet är således felaktiga.

💪 Uppgift 2.4

Beräkna (med hjälp av R) den betingade fördelningen som hjälper oss att rätta till det felaktiga påståendet.

tally(~ age.group | brand, data = SmartPhones, format = "percent", margins = TRUE)
         brand
age.group      Asus     Casio       HTC    iPhone        LG  Motorola    Others
    18-34  50.00000  59.52381  55.31915  41.30688  25.89286  24.62687  10.71429
    35-49  34.00000  26.19048  23.40426  25.55426  24.70238  22.38806  10.71429
    50+    16.00000  14.28571  21.27660  33.13886  49.40476  52.98507  78.57143
    Total 100.00000 100.00000 100.00000 100.00000 100.00000 100.00000 100.00000
         brand
age.group   Samsung      Sony
    18-34  30.44983  44.03670
    35-49  29.06574  30.27523
    50+    40.48443  25.68807
    Total 100.00000 100.00000
Tip

Om du har förstått innebörden av formula-syntaxen ~ brand | age.group (eller alternativt brand ~ age.group) borde denna uppgift vara enkel.

💪 Uppgift 2.5

Rätta det felaktiga påståendet i sista delfrågan på Uppgift 2.2.

Titta vi på tabellen ovan ser vi bland de som föredrar en iphone är 41.3% i åldersgruppen 18-34 medan 33.2% är i åldersgruppen 50+.

3. Jämföra fördelningar för kategoriska variabler

När vi jämför variablers fördelningar är det ofta via grafiska metoder. Vilken typ av plot som är lämpligast beror på om variablerna vi jämför är numeriska eller kategoriska. Vi börjar med fallet då båda variablerna är kategoriska, dvs samma scenario som i Avsnitt 2 ovan.

Visst skulle vi till exempel kunna kolla på andelarna för smartphonepreferens betingat på åldersgrupp vi räknade i Avsnitt 2, dvs:

tally(~ brand | age.group, data = SmartPhones, format = "proportion")
          age.group
brand            18-34       35-49         50+
  Asus     0.028801843 0.025679758 0.008264463
  Casio    0.028801843 0.016616314 0.006198347
  HTC      0.029953917 0.016616314 0.010330579
  iPhone   0.407834101 0.330815710 0.293388430
  LG       0.100230415 0.125377644 0.171487603
  Motorola 0.038018433 0.045317221 0.073347107
  Others   0.006912442 0.009063444 0.045454545
  Samsung  0.304147465 0.380664653 0.362603306
  Sony     0.055299539 0.049848943 0.028925620

Från dessa betingade fördelningar ser vi till exempel att iPhone är den populäraste smartphonen i åldersgruppen 18-34 och näst populäraste i de andra två åldersgrupperna. Vi ser också att andelen som föredrog iPhone var ca 41% i åldersgruppen 18-34, gentemot ca 33% bland åldersgruppen 35-49 och ca 29% i åldersgruppen 50+.

Informationen i tabellen ovan blir ännu tydligare i när den presenteras med ett stapeldiagram för varje åldersgrupp.

bargraph(~ brand | age.group, data = SmartPhones, type = "proportion")

💪 Uppgift 3.1

Svara på följande frågor:

  • Vad kan man säga om preferensen för Others-kategorin mellan åldersgrupperna?

    Vi ser att bland de som är i åldersgruppen 50+ tenderar “Others” att föredras i högre utsträckning än bland de två andra åldersgrupperna.

  • Vilken är den populäraste smartphonen för respektive åldersgrupp?

    Åldersgrupp 18-34:Iphone, åldergrupp 35-49 Samsung och åldersgrupp 50+ Samsung

  • Är påståendet ‘’Summan av alla staplarna för åldersgruppen 50+ är 1’’ korrekt? Varför/varför inte?

    Det stämmer för det är en betingad fördelning.

  • Är påståendet ‘’Summan av iPhone staplarna över de tre åldersgrupperna är 1’’ korrekt? Varför/varför inte?

    Stämmer inte eftersom det varken är en simultan, marginal eller betingad föredelning. Tittar vi endast på staplarna på Iphone i stapeldiagrammet så bildar inte dem någon fördelning.

💪 Uppgift 3.2

Använd bargraph() för att plotta de betingade fördelningarna för åldersgrupperna betingat på smartphonepreferens.

bargraph(~ age.group | brand, data = SmartPhones, type = "proportion")

💪 Uppgift 3.3

Svara på följande frågor:

  • Hur ser åldersfördelningen ut för smartphonepreferensen Others gentemot Casio?

    Vi ser att givet att man föredrar “Other” har det en större andel i åldersgruppen 50+ och mindre andelar i de andra två åldersgrupperna. Men givet att man föredrar ” Casio” så ser föredelning av åldersgrupperna omvänt ut. Det är exempelvis en mycket större andel i åldersgruppen 18-34 bland de som föredrar Casio än bland de som föredrar “Others”.

  • Hur ser åldersfördelningen ut för smartphonepreferensen HTC?

    För märket HTC ser vi att åldersfördelningen i åldersgrupperna 35-49 och 50+ ser ganska lika ut men det är en högre andel nästan 2 gånger fler i åldersgruppen 18-34 än åldersgrupp 35-49.

  • Är påståendet ‘’Summan av 50+ staplarna över de nio smartphonespreferensgrupperna är 1’’ korrekt? Varför/varför inte?

    Det stämmer inte eftersom här tittar vi på betingade fördelningar av åldersgrupp givet vilket telefonmärke man föredrar.

Vi kan också göra ett staplat stapeldiagram (stacked barchart) för att kompakt visa resultaten i Uppgift 3.2 För detta använder vi barplot() funktionen i base R, då mosaic-paketet inte har en sådan funktion (se nedan för en liknande plot, mosaicplotten). Vi behöver först skapa och spara den betingade fördelningen med hjälp av tally().

t <- tally(~ age.group | brand, data = SmartPhones, format = "prop")
barplot(t, col = c("aquamarine", "cornflowerblue", "darkblue"), xlab = "Brands", ylim = c(0,1.7), legend=c("18-34", "35-49", "50+"), las=2)

Det enda argumentet till funktionen ni inte har stött på tidigare är las = 2, som ser till att namnen på kategorierna hamnar vertikalt istället för horisontellt (så de får plats i figuren).

💪 Uppgift 3.4

Vilken av de två figurerna ovan tycker ni är enklast att jämföra proportionerna mellan grupperna i?

Stapeldiagram är tydligare än barplot diguren.

💪 Uppgift 3.5

Om vi, för varje grupp vi betingar på, istället vill ha staplarna bredvid varandra (och inte ovanpå varandra) kan vi använda argumentet beside beside = TRUE. Gör en sådan plot.

t <- tally(~ age.group | brand, data = SmartPhones, format = "prop")
barplot(t, col = c("aquamarine", "cornflowerblue", "darkblue"), xlab = "Brands", ylim = c(0,0.8), legend=c("18-34", "35-49", "50+"), las=2, beside=TRUE)

Vi har gått igenom mosaicplot på Föreläsning 4. Notera att namnet på plotten inte har med mosaic-paketet att göra. En mosaicplot är en stacked barchart, men innehåller också information om marginalfördelningen på variabeln man betingar på. Vi kan använda funktionen mosaic() från vcd-paketet. Viktigt att notera att variabeln vi betingar på hamnar på y-axeln, till skillnad från x-axeln som mosaicplottarna i boken.

suppressMessages(library(vcd))
t <- tally(~ age.group | brand, data = SmartPhones, format = "prop")
vcd::mosaic(~ age.group | brand, data = SmartPhones)

Notera att vi anropar funktionen via vcd::mosaic() istället för mosaic(), då den senare refererar till mosaic-paketet och inte till funktionen mosaic() från vcd-paketet som är den vi vill använda.

Variabeln smartphonepreferens har för många utfall (kategorier), vilket gör mosaicplotten oläslig. Tyvärr har inte funktionen argumentet las vi använde oss av för att rotera texten i bargraph(). För enkelhetens skull, låt oss definiera en ny dataframe där vi endast behåller repondenter som har svarat iPhone, Samsung, LG eller Sony och illustrera mosaicplotten med dessa nya data. Här är ett exempel där tidyverse löser uppgiften på ett mer elegant sätt än base R med funktionen filter().

suppressMessages(library(dplyr))
SmartPhones_new <- filter(SmartPhones, brand == "iPhone" |brand == "Samsung"|brand == "LG" | brand == "Sony")

Notera att i koden ovan så har inte |-tecknet samma betydelse som i formula-syntax, där den betyder betingat på. I koden ovan betyder |-tecknet “eller”. filter anropet ovan behåller alltså de observationer som har värdet brand lika med “iPhone” eller “Samsung” eller “LG” eller “Sony”. Tecknet == är en jämförelse, dvs filter() funktionen kollar om brand är lika med de värdena vi har angett och om så är fallet så behålls den. Om brand till exempel skulle ha värdet “Casio” så kommer den inte att behållas.

💪 Uppgift 3.6

Använd tally() för att beräkna den betingade fördelningen age.group givet brand samt marginalfördelningen för brand för den nya dataframen SmartPhones_new.

tally(~ age.group | brand, data = SmartPhones_new, format = "proportion", margins = TRUE)
         brand
age.group    iPhone        LG   Samsung      Sony
    18-34 0.4130688 0.2589286 0.3044983 0.4403670
    35-49 0.2555426 0.2470238 0.2906574 0.3027523
    50+   0.3313886 0.4940476 0.4048443 0.2568807
    Total 1.0000000 1.0000000 1.0000000 1.0000000
tally(~brand, data = SmartPhones_new,format = "proportion")
brand
    iPhone         LG    Samsung       Sony 
0.39511296 0.15491010 0.39972337 0.05025357 

💪 Uppgift 3.7

Använd vcd::mosaic() för att göra en mosaicplot för age.group givet brand för den nya dataframen SmartPhones_new. Stämmer de betingade fördelningarna samt marginalfördelningen i plotten överens med de ni räknade fram i Uppgift 3.6?

vcd::mosaic(~ age.group | brand, data = SmartPhones_new)

#Fråga detta
Extra: Ett första steg mot att arbeta mer självständigt.

Denna uppgift bör göras först efter att man gjort klart resten av labben. Uppgiften kan hoppas över vid brist på tid, då ni redan lärt er beskriva samband mellan kategoriska variabler. Syftet med uppgiften är att ni ska använda de verktygen ni har lärt er på ett självständigt sätt.

Ni kan tillämpa det ni har lärt er i Avsnitt 3 på ett nytt datamaterial. Vi föreslår att ni analyserar sambandet mellan Survived och Class i Titanic datasetet. I Lab 2 analyserade ni variablerna var för sig. Er uppgift nu är att studera om det föreligger ett samband mellan Survived och Class och hur detta samband ser ut.

suppressMessages(library(openxlsx)) # 
titanic <- read.xlsx("https://github.com/StatisticsSU/SDA1/raw/main/datorlab/lab2/Chapter_3.xlsx", sheet = "Titanic")

4. Samband mellan en numerisk och en kategorisk variabel

I Lab 2 presenterades histogrammet som ett verktyg att beskriva fördelningen för en numerisk variabel. Om vi vill studera hur sambandet mellan en numerisk och en kategorisk variabel ter sig är det naturligt att göra ett histogram av den numeriska variabeln för varje utfall av den kategoriska variabeln. Ett sådant histogram är en betingad fördelning, eftersom endast observationerna som tillhör utfallet vi betingar på för den kategoriska variabeln används vid konstruktionen av histogrammet.

Låt oss illustrera koncepten med ett dataset över forcerad utandningsvolym, forced expiratory volume (FEV) på engelska, hos 606 barn och ungdomar. De numeriska variblerna i datasetet är forcerad utandningsvolym (fev), längd (height) och ålder (age). De kategoriska variablerna är rökare (smoking, ja kodat som 1 och nej kodat som 0), åldersgrupp (age.group) och kön (gender). Data finns i FevChildren.RData.

load(file = url("https://github.com/StatisticsSU/SDA1/blob/main/datorlab/lab3/FevChildren.RData?raw=true"))
str(FevChildren)
'data.frame':   606 obs. of  6 variables:
 $ fev      : num  1.71 1.72 1.72 1.56 1.9 ...
 $ height   : num  145 171 138 135 145 ...
 $ smoking  : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ gender   : Factor w/ 2 levels "f","m": 1 1 1 2 2 1 1 1 1 1 ...
 $ age      : num  9 8 7 9 9 8 6 6 8 9 ...
 $ age.group: Factor w/ 3 levels "6-9","10-14",..: 1 1 1 1 1 1 1 1 1 1 ...
head(FevChildren)
    fev height smoking gender age age.group
1 1.708 144.78       0      f   9       6-9
2 1.724 171.45       0      f   8       6-9
3 1.720 138.43       0      f   7       6-9
4 1.558 134.62       0      m   9       6-9
5 1.895 144.78       0      m   9       6-9
6 2.336 154.94       0      f   8       6-9

💪 Uppgift 4.1

Använd histogram() funktionen från mosaic-paketet för att plotta den marginella fördelningen för fev. Beräkna de olika fördelningsmåtten med hjälp av favstats() och beskriv fördelningen.

histogram(~ fev, data = FevChildren, type = "count")

favstats(~ fev, data = FevChildren)
   min     Q1 median     Q3   max     mean        sd   n missing
 1.165 2.0915   2.58 3.1455 5.793 2.695568 0.8295047 606       0

Finns det något samband mellan den forcerade utandningsvolymen (fev) och åldersgrupp (age.group)? Låt oss göra ett histogram för den forcerade utandningsvolymen betingat på de olika åldersgrupp samt räkna ut fördelningsmåtten för att besvara frågan.

histogram(~ fev | age.group, data = FevChildren)

favstats(~ fev | age.group, data = FevChildren)
  age.group   min      Q1 median      Q3   max     mean        sd   n missing
1       6-9 1.165 1.72100 2.0735 2.45175 3.842 2.113778 0.4813427 270       0
2     10-14 1.458 2.57575 3.0430 3.45950 5.224 3.089574 0.6965719 296       0
3     15-17 2.198 2.99825 3.6810 4.28775 5.793 3.707000 0.9137702  40       0

Vi ser att de med de största forcerade utandningsvolymen återfinns i den äldsta åldersgruppen. Vi kan också se att både medelvärdet och medianen ökar med åldersgrupp. Resultaten är förväntade då äldre barn och ungdomar har också större lungor.

💪 Uppgift 4.2

Hur ser sambandet mellan den forcerade utandningsvolymen (fev) och rökning (smoking) ut? Är resultaten förväntade?

histogram(~ fev | smoking, data = FevChildren, type = "percent")

favstats(~ fev | smoking, data = FevChildren)
  smoking   min    Q1 median    Q3   max     mean        sd   n missing
1       0 1.165 2.048  2.531 3.079 5.793 2.634628 0.8160305 545       0
2       1 1.694 2.759  3.122 3.727 4.872 3.240033 0.7519699  61       0
# Rökare tenderar att ha ett högre värde på fev (forcerad utandingsvolym) än icke-rökare. Resultaten kan vara missvisande här. Det är rimligt att tro att det finns en lurking variable här som förmodeligen är ålder. Äldre barn tnderar att ha en större utandningsvolym, men de är också mer benägna att röka än yngre barn. Att exkludera ålder från analysen kan därför ge missvisande resultat.

Vi kan också betinga på mer än en variabel. Exempelvis kan vi plotta fördelningen för fev betingat på smoking och åldersgrupp (age.group).

histogram(~ fev | smoking + age.group, data = FevChildren)

favstats(~ fev | smoking + age.group, data = FevChildren)
  smoking.age.group   min     Q1 median    Q3   max     mean        sd   n
1             0.6-9 1.165 1.7200  2.076 2.455 3.842 2.114375 0.4821395 269
2             1.6-9 1.953 1.9530  1.953 1.953 1.953 1.953000        NA   1
3           0.10-14 1.458 2.5625  2.993 3.446 5.224 3.064416 0.6890278 255
4           1.10-14 1.694 2.9530  3.152 3.498 4.789 3.246049 0.7311560  41
5           0.15-17 2.635 3.5000  3.985 4.500 5.793 4.079952 0.8827685  21
6           1.15-17 2.198 2.7370  3.122 3.763 4.872 3.294789 0.7756381  19
  missing
1       0
2       0
3       0
4       0
5       0
6       0

Vi såg tidigare att de största forcerade utandningsvolymen återfanns i den äldsta åldersgruppen. Histogrammen i första raden ovan visar att de också fanns bland icke-rökarna. Notera att ett av utfallen, åldersgrupp 6-9 har endast 1 observation (en alltför ung rökare). Det är då inte så meningsfullt att vare sig plotta ett histogram eller räkna fördelningsmått.

Bland åldersgrupp 15-17 ser vi att både medianen och medelvärdet är högre bland de som inte röker jämfört med rökarna. För åldersgrupp 10-14 är medianen och medelvärdet högre bland de som röker jämfört med de som inte röker. Betyder det att det är bättre för lugnkapaciteten att röka om man är i åldersgruppen 10-14? Notera först att skillnaden mellan medelvärdena (och medianerna) för åldersgrupp 15-17 mellan rökare och icke-rökare är betydligt större jämfört med de motsvarande skillnaderna för åldersgrupp 10-14. Skillnaderna för åldersgrupp 10-14 är ganska små — kan det vara så att det är slumpfaktorn som har resulterat i högre medelvärde (och median) för rökarna (jämfört med icke-rökarna) i åldersgrupp 10-14? Hade vi tagit ett nytt stickprov på 606 nya barn och ungdomar hade vi kanske fått det omvända resultatet, dvs att medelvärdet (och medianen) för rökarna i åldersgrupp 10-14 hade varit lägre än icke-rökarna i samma åldersgrupp. Ett resultat som är orsakat av slumpen sägs vara icke signifikant (statistiskt insignifikant). För att statistiskt säkerställa att skillnaderna inte beror på slumpen behöver vi vänta till kursens andra del, men det är viktigt att ni redan nu förstår att små avvikelser kan bero på slumpen och inte dra för mycket slutsatser.

Vi kan också notera att formula-syntax med mosaicpaketet som vi har använt ovan är kompakt och lätt att implementera. Vi kan göra samma sorts figurer i base R, men det kräver betydligt mer kod som är dessutom krångligare att förstå (klicka i marginalen om du är intresserad).

💪 Uppgift 4.3

Använd histogram() för att plotta fördelningen för fev betingat på kön (gender) och age.group. Beräkna även fördelningsmåtten med favstats() och kommentera resultaten.

histogram(~ fev | gender + age.group, data = FevChildren)

favstats(~ fev | gender + age.group, data = FevChildren)
  gender.age.group   min     Q1 median      Q3   max     mean        sd   n
1            f.6-9 1.292 1.7245 2.0725 2.41125 3.223 2.098776 0.4565142 134
2            m.6-9 1.165 1.7175 2.0735 2.45775 3.842 2.128559 0.5058698 136
3          f.10-14 1.458 2.5630 2.8680 3.15200 3.835 2.872844 0.4299766 141
4          m.10-14 1.665 2.6270 3.2310 3.91500 5.224 3.286729 0.8241745 155
5          f.15-17 2.198 2.6350 2.9030 3.21100 3.674 2.909176 0.4360915  17
6          m.15-17 3.082 3.7650 4.2790 4.50500 5.793 4.296696 0.6974736  23
  missing
1       0
2       0
3       0
4       0
5       0
6       0
#Skillnaden i utandningsvolymen mellan pojkar och flickor verkar öka ju äldre de blir. Pojkarna tenderar också att ha en större variation inom varje åldersgrupp än flickorna.

Ett annat sätt att illustrera samband mellan en numerisk variabel och kategoriska variabler är att använda en boxplot där man betingar på de kategoriska variablerna. Fördelen med denna ansats är att vi kan summera allt i en figur, istället för att använda många figurer som vi gjorde med histogram ansatsen. Det går att plotta flera histogram i samma plot med tidyverse-syntax och också med base R, men figuren kan bli ganska stökig (klicka i marginalen om du är intresserad).

Följande kod plottar samma fördelning som i Uppgift 4.3, men med boxplot() istället för histogram(). Som vi noterade i Avsnitt 2 så använder boxplot() den alternativa formula-syntaxen, dvs istället för ~ fev | gender + age.group skriver vi fev ~ gender + age.group.

boxplot(fev ~ gender + age.group, data = FevChildren)

En fördel med boxplotten kontra histogrammet är att alla medianer visas, dessutom i samma figur, vilket förenklar jämförelser mellan grupperna utan att behöva använda favstats().

💪 Uppgift 4.4

Använd boxplot() för att jämföra fördelningarna för fev betingat på olika utfall av smoking och age.group. Ovan hade vi en diskussion om statistisk signifikans för samma exempel. Ser ni i figuren att skillnaderna för medianerna i åldersgrupp 10-14 mellan rökare och icke rökare är liten jämfört med samma skillnad i åldersgrupp 15-17? Vilken av dessa skillnader är mest trolig att vara statistiskt signifikant?

boxplot(fev ~ smoking + age.group, data = FevChildren)

#Skillnaden i den senare åldersgruppen är mest trolig att vara statistiskt signifikant.

5. Tidsserier

Tidsserieanalys är ett stort område inom statistik. I den här kursen går vi inte in så mycket på tidsserier, mer än att lär oss att plotta dom.

Filen CAPM_data.RData innehåller tidsserier över månadsavkastningar för olika finansiella tillgångar samt makroekonomiska variabler såsom obligationsränta (RKFREE) och konsumentprisindex (CPI). Observationerna är ordnade i tid, där första observationen är från januari 1978 och sista observationen är från december 1987. Observationerna är på månadsfrekvens, så vi har totalt 120 observationer (12 per år under 10 år). Månadsavkastningen \(r_t\) för en finansiell tillgång som är värderar till \(S_t\) i period \(t\) definieras som \[r_t=\frac{S_t-S_{t-1}}{S_{t-1}}.\]

Exempelvis, antag att tillgången var värderad till 105 vid tidpunkten \(t-1\), dvs \(S_{t-1}=100\), och 110 vid tidpunkten \(t\), dvs \(S_{t}=110\). Då är månadsavkastningen i perioden \(t\)

\[r_t = \frac{110 - 105}{105} \approx 0.048,\]

dvs en uppgång på nästan 5% jämfört med föregående månad.

Vi läser in data samt inspekterar variabeltyperna.

load(file = url("https://github.com/StatisticsSU/SDA1/blob/main/datorlab/lab3/CAPM_data.RData?raw=true"))
str(CAPM)
'data.frame':   120 obs. of  22 variables:
 $ DATE  : Date, format: "1978-01-31" "1978-02-28" ...
 $ MARKET: num  -0.045 0.01 0.05 0.063 0.067 ...
 $ RKFREE: num  0.00487 0.00494 0.00526 0.00491 0.00513 ...
 $ BOISE : num  -0.079 0.013 0.07 0.12 0.071 ...
 $ CONED : num  -0.079 -0.003 0.022 -0.005 -0.014 ...
 $ CONTIL: num  -0.129 0.037 0.003 0.18 0.061 ...
 $ CITCRP: num  -0.115 -0.019 0.059 0.127 0.005 ...
 $ DATGEN: num  -0.084 -0.097 0.063 0.179 0.052 ...
 $ DEC   : num  -0.1 -0.063 0.01 0.165 0.038 ...
 $ DELTA : num  -0.028 -0.033 0.07 0.15 -0.031 ...
 $ GENMIL: num  -0.099 0.018 -0.023 0.046 0.063 ...
 $ GERBER: num  -0.048 0.16 -0.036 0.004 0.046 ...
 $ IBM   : num  -0.029 -0.043 -0.063 0.13 -0.018 ...
 $ MOBIL : num  -0.046 -0.017 0.049 0.077 -0.011 ...
 $ PANAM : num  0.025 -0.073 0.184 0.089 0.082 ...
 $ PSNH  : num  -0.008 -0.025 0.026 -0.008 0.019 ...
 $ TANDY : num  -0.075 -0.004 0.124 0.055 0.176 ...
 $ TEXACO: num  -0.054 -0.01 0.015 0 -0.029 ...
 $ WEYER : num  -0.116 -0.135 0.084 0.144 -0.031 ...
 $ POIL  : num  7.9 7.87 7.79 7.86 7.89 ...
 $ FRBIND: num  126 128 128 129 130 ...
 $ CPI   : num  167 167 168 168 169 ...

Notera att dataframen som laddas in heter CAPM och inte CAPM_data. Det finns ingen koppling mellan filnamnet och namnet på dataframen i R. Namnet på dataframen bestäms av vad den döptes till när den sparades, i det här fallet CAPM.

Vi noterar att alla variabler förutom DATE är numeriska. DATE är i såkallad Date-format, vilket gör att R förstår att det är ett datum, trots att den verkar lagras som strängar enligt utskriften ovan. R behandlar alltså inte DATE som en kategorisk variabel.

Datasetet innehåller variabeln MARKET, vilket är marknadsportföljensavkastning (dvs alla tillgångar i marknaden). Vi kan göra en tidsserieplot för marknadsportföljens avkastning.

plot(MARKET ~ DATE, data = CAPM, col = "darkblue")

Eftersom det vi plottar är en tidsserie så är observationerna ordnade och då är det vanligt att man binder ihop observationerna med linjer, dvs en linjeplot. Detta kan vi göra genom att använda argumentet type = "l" i funktionen plot(), där “l” står för line.

plot(MARKET ~ DATE, data = CAPM, col = "darkblue", type = "l")

💪 Uppgift 5.1

Om vi tycker att linjen är för tunn kan vi kontrollera dess tjocklek med plot() funktionens argument lwd som står för linewidth. Defaultvärdet (dvs värdet som används om inget annat anges) är lwd = 1. Om vi vill ha en linje som är 50% tjockare anger vi lwd = 1.5. Gör om plotten ovan med en dubbelt så tjock linje.

plot(MARKET ~ DATE, data = CAPM, col = "darkblue", type = "l",lwd = 1.5)

# Write your code here

Från tidsserieplotten ser vi ser att, över en lång period, så kan marknaden ha ganska kraftiga svängningar.

💪 Uppgift 5.2

Black Monday är namnet på en av de värsta börskrascherna någonsin. Black Monday inträffade oktober 1987. Kan ni se Black Monday händelsen i tidsserien? Hur mycket föll marknadsportföljen den månaden?

index=which.min(CAPM$MARKET)# hämta minsta värdet i kolumn
index
[1] 118
CAPM[index,2]# hämta ut värdet på observation på kolumn no2 och rad 118
[1] -0.26
my_value= CAPM[index,2]
plot(MARKET ~ DATE, data = CAPM, col = "darkblue", type = "l",lwd = 1.5)
points(x=CAPM[index,1] #letar efter rad
       ,y=my_value,#värdet= -0,26
       col = "red",pch=19)

Tip

Ibland kan det vara bra att kunna hämta ut en variabel från en dataframe. Antag att vi har en dataframe my_data med en variabel vid namn x. Vi kan använda $-tecken för att hämta ut den variabeln från dataframen. Vi skriver då my_data$x.

💪 Uppgift 5.3

Plotta tidsserien för tillgången CITCRP. Hur drabbades CITCRP av Black Monday jämfört med marknadsportföljen? Skriv ut return för CITCRP och jämför med Uppgift 5.2.

index=which.min(CAPM$CITCRP)# hämta minsta värdet i kolumn
index
[1] 118
CAPM[index,7]# hämta ut värdet på observation på kolumn no2 och rad 118
[1] -0.282
my_value= CAPM[index,7]
plot(CITCRP ~ DATE, data = CAPM, col = "purple", type = "l",lwd = 1.5,xlab="Time")
points(x=CAPM[index,1] #letar efter värdet i rad 118 i kolumn 1
       ,y=my_value, col = "red",pch=19)

Notera att varje gång vi anropar plot() funktionen så skapas en ny figur. Ibland vill man plotta flera tidsserierna i samma graf. Detta kan åstadkommas genom att skapa första figuren med plot(), precis som vi gjort innan, och efterföljande figurer med lines(). lines() stödjer inte formula-syntax, så det här är ytterligare ett exempel på varför det är viktigt att kunna hämta ut variabler från en dataframe med hjälp av $-tecknet. Följande kod plottar tidsserierna för marknadsportföljen och CITCRP i samma graf. Koden lägger också till etiketter via legend() funktionen och justerar y-axelns definitionsområde via argumentet ylim, som ni också använde i Lab 2.

plot(MARKET ~ DATE, data = CAPM, col = "darkblue", type = "l", lwd = 2, ylim = c(-0.4, 0.4))
lines(x = CAPM$DATE, y = CAPM$CITCRP, col = "lightblue", type = "l", lwd = 2)
legend(x = "topright", lty = 1 , lwd = 2, col = c("darkblue", "lightblue"), legend=c("Market", "CITCRP"))

💪 Uppgift 5.4

Plotta de tre tidsserierna MARKET, CITCRP och DATGEN i samma figur. Använd lämpliga färger samt etiketter. Verkar tidsserierna följas åt? Vad tror ni att det beror på?

plot(MARKET ~ DATE, data = CAPM, col = "darkblue", type = "l", lwd = 2, ylim = c(-0.4, 0.4))
lines(x = CAPM$DATE, y = CAPM$CITCRP, col = "lightblue", type = "l", lwd = 1)
lines(x = CAPM$DATE, y = CAPM$DATGEN, col = "red", typ = "l",lwd = 1)
legend(x = "topright", lty = 1 , lwd = 2, col = c("darkblue", "lightblue","red"), legend=c("Market", "CITCRP","DATGEN"))

💪 Uppgift 5.5

Antag att ni skapar en portfölj som består av 30% IBM, 50% CITCRPoch 20% DATGEN. Plotta månadsavkastningen för er portfölj.

Tip

Avkastningen för en portfölj är en viktad linjär kombination av avkastningarna i tillgångarna som portföljen innehåller. I en portfölj med tre aktier vars vikter \(0<w_1<1, 0<w_2<1, 0<w_3<1\), med \(\sum_{k=1}^3w_k=1\), är portföljens avkastning \[r_t = w_1r^{(1)}_t + w_2r^{(2)}_t+w_3r^{(3)}_t,\]

där \(r^{(k)}_t\) är avkastningen för tillgång \(k\) i portföljen.

Nu när ni vet hur man kan använda $-tecken för att hämta ut variabler från en dataframe, kan ni lista ut hur man skapar en ny variabel som viktar variablerna enligt ovan (30% IBM, 50% CITCRPoch 20% DATGEN).

w1 = 0.3
w2 = 0.5
w3 = 0.2
IBM=CAPM[,13] #IBM = CAPM$IBM
CITCRP=CAPM$CITCRP
DATGEN=CAPM$DATGEN
rt =IBM*w1+CITCRP*w2+DATGEN*w3
plot(rt ~ DATE, data = CAPM, col = "darkblue", type = "l", lwd = 2, ylim = c(-0.4, 0.4))

6. Sammanfattning

I den här laborationen har du lärt dig:

  • Metoder för att räkna ut simultan fördelning, marginella fördelningar, samt betingade fördelningar.

  • Hur man jämför fördelningar grafiskt. Olika metoder används beroende på om en variablerna är numeriska eller kategoriska.

  • Hur man informellt resonerar kring statistisk signifikans.

  • Hur man kan presentera tidsseriedata med linjeplottar.

A. Appendix

Lista över några vanliga argument i grafer

  • col = färg, kan markeras med siffror eller med namnet på färgen, oftast med små bokstäver. Glöm ej att texten måste ligga inom citattecken.

  • main = rubrik på plotten, detta sätts till en textsträng, alltså en text inom citattecken.

  • xlab = rubrik på x-axeln, detta sätts till en textsträng, alltså en text inom citattecken.

  • ylab = rubrik på y-axeln, detta sätts till en textsträng, alltså en text inom citattecken.

  • xlim = definitionsområde för x-axeln. Exempelvis betyder xlim = c(0, 14.3) att det lägsta värdet som ritas kommer att vara 0 och det högsta värdet kommer att vara 14.3 (på x-axeln).

  • ylim = definitionsområde för y-axeln. Exempelvis betyder ylim = c(-2, 20.7) att det lägsta värdet som ritas kommer att vara -2 och det högsta värdet kommer att vara 20.7 (på y-axeln).

  • lwd = tjocklecken på linjer (eller prickar) i ett linjediagram (spridningsdiagram), anges med ett nummer.

  • lty = typ av linje (rak, streckad, prickad etc) i ett linjediagram, anges med ett nummer.

  • pch = typ av prick (rund, fyrkantig + * etc), sätts till ett nummer.

  • breaks = antal staplar i ett histogram.

  • cex = justering av etiketternas storlek i en figur (exempelvis cex = 0.5 i en legend() funktion minskar storleken som “legend-texten” tar upp i en figur med hälften). Finns även exempelvis cex.axis, cex.main för att justera storleken av texter på axlar respektive rubrik.

  • bg = bakgrundsfärg i en figur.

  • col.main = rubrikens färg.

  • col.lab = färger för rubrikerna på axlarna.

  • font = specificerar vilken typ av text man vill ha, exempelvis ger font = 3 kursiv text.